package QianFeng13;

import org.junit.Test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则表达式
 * 正则表达式(Regular Expression)
 * 正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
 * 则表达式通常被用来检索、替换那些符合某个模式的文本
 * java.util.regex包中提供以下两个类对正则表达式的支持:
 *  Matcher类
 *      通过解释Pattern对character sequence执行匹配操作的引擎。
 *  Pattern类
 *      正则表达式的编译表示形式。
 *  public final class Pattern extends Object implements Serializable
 * 正则表达式的编译表示形式。指定为字符串的正则表达式必须首先被编译为此类的实例。
 * 典型的调用顺序是
 * Pattern p = Pattern.compile("a*b");
 * Matcher m = p.matcher("aarrggbb");
 * boolean b = m.matches();
 *
 * public final class Matcher extends Object implements MatchResult
 * Matcher类的主要功能是用于进行正则的匹配，通过Pattern类中定义完的正则，
 * 再使用Matcher类进行验证或者替换。
 * 常用方法:
 * boolean matches()
 *      尝试将整个区域与模式匹配。
 * String replaceAll(String replacement)
 *      替换模式与给定替换字符串相匹配的
 *      输入序列的每个子序列。
 * String replaceFirst(String replacement)
 *      替换模式与给定替换字符串匹配的
 *      输入序列的第一个子序列。
 *
 * 在JDK 1.4之后加入了正则，随后又更新了String的操作类，因为在使用正则中，所有的内容
 * 通过字符串表示的比较多。在String类中有以下的方法可以完成对正则的支持:
 * boolean matches(String regex)
 *      告知此字符串是否匹配给定的正则表达式。
 * String replaceAll(String regex, String replacement)
 *      使用给定的replacement替换此字符串
 *      所有匹配给定的正则表达式的子字符串。
 * String replaceFirst(String regex, String replacement)
 *      使用给定的replacement替换此字符串
 *      匹配给定的正则表达式的第一个子字符串。
 * String[] split(String regex)
 *      根据给定正则表达式的匹配拆分此字符串。
 **/
public class RegexDemo {

    /*没有使用正则表达式来检查字符串是否由数字组成*/
    @Test
    public void Test1() {
        String s = "52013a4";
        char[] chars = s.toCharArray();
        boolean flag = true;
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] < '0' || chars[i] > '9') {
                flag = false;
                System.out.println("字符串中有非数字成份");
                break;
            }
        }
        if (flag) {
            System.out.println("字符串是由数字组成");
        }
    }

    @Test
    public void Test2() {
        //匹配一个模板
        Pattern p = Pattern.compile("a*b");
        Matcher m = p.matcher("aaaabbbb");
        boolean b = m.matches();
        System.out.println(b);
    }

    //使用正则表达式判断
    @Test
    public void Test3() {
        String s = "5201314";
        boolean b = s.matches("[0-9]+");
        boolean b1 = s.matches("\\d+");
        System.out.println(b + "-" + b1);
    }
}
